



S-C ASSEMBLER II
Disk Version 3.2

for the

APPLE II Computer





Copyright 1979
S-C SOFTWA RE
P.O. Box 280300
Dallas, Texas 75228
(214) 324-2050

---------------------------------------------------------------------

TABLE OF CONTENTS

1.0 Introduction and Feature List . . . . . . . . . . .   1

2.0  Commands  . . . . . . . . . . . . . . . . . . . . .  3
2.1  Assembler Commands  . . . . . . . . . . . . . . . .  3
2.1.1  Editing Commands  . . . . . . . . . . . . . . . .  4
2.1.1.1  NEW Command   . . . . . . . . . . . . . . . . .  4
2.1.1.2  RENUMBER Command  . . . . . . . . . . . . . . .  4
2.1.1.3  DELETE Command  . . . . . . . . . . . . . . . .  4
2.1.1.4  LIST Command  . . . . . . . . . . . . . . . . .  4
2.1.1.5  FIND Command  . . . . . . . . . . . . . . . . .  5
2.1.1.6  Screen Editing  . . . . . . . . . . . . . . . .  5
2.1.2  Listing Control Commands  . . . . . . . . . . . .  6
2.1.2.1  FAST Command  . . . . . . . . . . . . . . . . .  6
2.1.2.2  SLOW Command  . . . . . . . . . . . . . . . . .  6
2.1.2.3  PRT Command . . . . . . . . . . . . . . . . . .  6
2.1.3  Object Commands . . . . . . . . . . . . . . . . .  7
2.1.3.1  ASM Command . . . . . . . . . . . . . . . . . .  7
2.1.3.2  MGO Command . . . . . . . . . . . . . . . . . .  7
2.1.4  Tape Commands . . . . . . . . . . . . . . . . . .  8
2.1.4.1  LOAD Command  . . . . . . . . . . . . . . . . .  8
2.1.4.2  SAVE Command  . . . . . . . . . . . . . . . . .  8
2.1.4.3  JOIN Command  . . . . . . . . . . . . . . . . .  8
2.2 DOS Commands . . . . . . . . . . . . . . . . . . . .  8
2.2.1  Housekeeping Commands . . . . . . . . . . . . . .  9
2.2.2  Source Maintenance Commands . . . . . . . . . . .  9
2.2.3  Object Maintenance Commands . . . . . . . . . . .  9
2.2.4  I/O Selection Commands  . . . . . . . . . . . . .  9
2.2.5  BASIC Commands  . . . . . . . . . . . . . . . . .  9
2.3  Monitor Commands  . . . . . . . . . . . . . . . . . 10

3.0  Source Program Format . . . . . . . . . . . . . . . 11
3.1  Label Field . . . . . . . . . . . . . . . . . . . . 11
3.2  Opcode Field  . . . . . . . . . . . . . . . . . . . 12
3.3  Operand Field . . . . . . . . . . . . . . . . . . . 12
3.4  Comment Field . . . . . . . . . .   . . . . . . . . 12
3.5  Comment Lines . . . . . . . . . . . . . . . . . . . 12
3.6  Sample Source Program . . . . . . . . . . . . . . . 13

4.0  Assembler Directives  . . . . . . . . . . . . . . . 15
4.1  .OR -- Origin   . . . . . . . . . . . . . . . . . . 15
4.2  .TA -- Target Address . . . . . . . . . . . . . . . 15
4.3  .EN -- End of Program . . . . . . . . . . . . . . . 17
4.4  .EQ -- Equate . . . . . . . . . . . . . . . . . . . 18
4.5  .DA -- Data . . . . . . . . . . . . . . . . . . . . 18
4.6  .HS -- Hex String . . . . . . . . . . . . . . . . . 19
4.7  .AS -- ASCII String . . . . . . . . . . . . . . . . 19

5.0  Operand Expressions . . . . . . . . . . . . . . . . 21
5.1  Decimal Numbers . . . . . . . . . . . . . . . . . . 21
5.2  Hexadecimal Numbers . . . . . . . . . . . . . . . . 21
5.3  Labels  . . . . . . . . . . . . . . . . . . . . . . 21
5.4  Asterisk (*)  . . . . . . . . . . . . . . . . . . . 22

---------------------------------------------------------------------

6.0 Addressing Modes . . . . . . . . . . . . . . . . . . 23
6.1  Implied Mode  . . . . . . . . . . . . . . .  . . . 25
6.2  Relative Mode . . . . . . . . . . . . . . . . . . . 25
6.5  Other Modes . . . . . . . . . . . . . . . . . . . . 25
6.4  Chart of Other Modes  . . . . . . . . . . . . . . . 26

7.0  SWEET-16  . . . . . . . . . . . . . . . . . . . . . 27
7.1  Sample SWEET-16 Program . . . . . . . . . . . . . . 28

Appendix . -- Operation and Memory Usage . . . . . . .  A-1
A.1  Contents of the Disk  . . . . . . . . . . . . . .  A-1
A.2  Copying the Disk  . . . . . . . . . . . . . . . .  A-1
A.3  Memory Usage  . . . . . . . . . . . . . . . . . .  A-2
A 4  ROM Usage . . . . . . . . . . . . . . . . . . . .  A-2
A.5  Description of Sample Source Programs . . . . . .  A-4
A.6  Useful Information  . . . . . . . . . . . . . . .  A-4
A.7  Handy Patches . . . . . . . . . . . . . . . . . .  A-5

Appendix B -- Error Messages . . . . . . . . . . . . .  B-1

Appendix C -- Printer Software . . . . . . . . . . . .  C-1
C.1 Listing of the PRT Subroutine  . . . . . . . . . .  C-2

Appendix D -- Bibliography . . . . . . . . . . . . . .  D-1
D.1 Sources of Help for 6502 Programming . . . . . . .  D-1
D.2 Sources of Help for SWEET-16 . . . . . . . . . . .  D-2

Registration Form

---------------------------------------------------------------------

INTRODUCTION


S-C ASSEMBLER II is a convenient and powerful tool for software
develcpment on the Apple II Computer.  The assembler uses standard
6502 mnemonics and syntax, and includes many useful features for
creating, editing, assembling, and testing your assembly language
programs.  Now assembly language programming is almost as easy as
prograinming in BASIC.

Here is a summary of the most exciting features:
*   Operates as a subsystem under standard Apple DOS 3.2
*   BASIC-like text editing (line numbers, LIST and DELETE commands)
*   Full Apple II screen editing
*   Tab stops for opcode, operand, and comment fields
*   A fast RENUMBER command
*   LOAD and SAVE commands to maintain your programs on disk or tape.
*   Labels of from 1 to 6 characters
*   Arithmetic expressions in operand field (using decimal, hexadecimal
    numbers and labels)
*   Comments, for built-in documentation
*   English-language error messages
*   FIND command, to search through source programs
*   Ability to assemble standard syntax SWEET-16 opcodes
*   All DOS commands usable from within S-C ASSEMBLER II
*   All Apple Monitor commands usable from within S-C ASSEMBLER II
*   Speed and suspension control over listing and assembly
*   Built-in software for controlling the Practical Automation DMTP-6uP
    Printer (easily replaceable with software for any other printer)
*   Ability to use Apple parallel or serial printer interface cards to
    any printer (PR#s command)
*   Continuing development and support by S-C SOFTWARE to provide more
    useful features and extensions with future releases








- 1 -

---------------------------------------------------------------------



---------------------------------------------------------------------

COMMANDS


There are three types of commands in S-C ASSEMBLER II:

Assembler Commands, DOS Commands, and Monitor Commands. The Assembler
Commands are used to control the editor and assembler.  All of the
Apple Monitor and DOS Commands are recognized, although they are not
all of use from within S-C ASSEMBLER II.  Commands are typed
immediately after the prompt symbol, which is a colon (:).

ASSEMBLER COMMANDS

There are thirteen assembler commands in S-C ASSEMBLER II. All
assembler commands may be abbreviated to the first three letters if
you so desire.


ASM                     Assemble source program, put object program
                        into memory, and produce assembly listing.

DELETE line#            Delete specified line.
DELETE line#,line#      Delete line range.

FAST                    Select normal listing speed, turn off printer
                        software.

FIND string             List all lines containing the specified string.

JOIN                    Join a program from tape to one already in memory.

LIST                    List entire source program.
LIST line#              List specified line.
LIST line#,line#        List line range.

LOAD                    Load source program from tape.

MGO expression          Execute object program, starting at address
                        specified by value of expression.

NEW                     Delete entire source program, start all over.

PRT                     Turn on printer software.

RENUMBER                Renumber all lines of source program starting
                        with 1000, in steps of 10.

SAVE                    Save source program on tape.

SLOW                    Select slow listing speed, turn off printer
                        software.




- 3 -

---------------------------------------------------------------------

The assembler commands can be conveniently grouped into editing
commands, listing control commands, object commands, and tape
commands.

Editing Commands

The editor in S-C ASSEMBLER II combines the powerful Apple screen
editing features with a BASIC-like line editor. Source programs are
entered and edited in almost exactly the same way you would enter and
edit an Integer BASIC program.

NEW Command:  Deletes the current source program from memory, and
restarts S-C ASSEMBLER II just as though you re-entered it from the
monitor or DOS.

RENUMBER Command:  Assigns new line numbers to every line in the
current source program.  The first line will receive the number 1000,
and subsequent lines will be numbered with an increment of 10.  (See
Appendix A for instructions for setting a different starting line
number or increment.)

DELETE Command:  Deletes a line or a range of lines from your source
program, just as in BASIC.  Another way to delete a single line is to
type its line number followed immediately by a carriage return.
(Warning: DELETE followed by a file name is a DOS command, and will
delete a file from your disk.)

LIST Command:  Lists a single line, a range of lines, or your entire
program; it works just like the LIST command in BASIC. While a
program or a range of lines is listing, you can momentarily stop the
listing by hitting the space bar. Tapping the space bar again will
restart the listing.  You can abort the listing by hitting the RETURN
Key.  The SLOW and FAST commands allow you to control the listing
speed. If you list a single line, it is displayed on the screen in a
position which makes it easy to edit using the Apple II screen
editing tools.






- 4 -

---------------------------------------------------------------------

FIND Command:  Search through your source program for a given text
string, and list all the lines which contain that string. You may
type FIN or FIND, followed by a space, followed by the text string
for which you are searching.  Every character you type between the
space and the carriage return is part of the search key, so you can
prefix or append spaces to the key to perform label searches.

Screen Editing:  The Apple II screen editing tools are quite powerful
and actually very easy to use.  However, many owners do not use them
because of the very limited explanation in the original Apple
Documentation.  Now it is described well in the A~nle II BASIC
Programming Nanual (pages 28-30 and 49-55), and the A~~lesoft II
BASIC Reference Manual (pages 54-55 and 110-114).

Briefly, the left arrow is a backspace, and deletes one character
from the input buffer each time it is used.  The right arrow adds to
the input buffer the character from the screen that the cursor was
covering just before you type the arrow key.  Four escape character
sequences allow you to move the cursor anywhere on the screen you
wish without affecting the input bufferi

    escape A    Right 1             (if at end of line, go to
                                     beginning of next line)
    escape B    Left 1              (if at beginning of line, go
                                     to end of previous line)
    escape C    Down 1 line
    escape D    Up 1 line

These escape character sequences can be a little clumsy, due to the
necessity of hitting the escape key and then a letter for each cursor
movement.  S-C ASSEMBLER II allows you to substitute control-A for
escape-A, control-B for escape-B, and so on.  The escape sequences
still work, but you can type faster using the control form.  The
control form is especially nice when you need to repeat the same
motion a number of times.

You can edit a source line previously entered by listing it with the
LIST command, moving up to it by typing control-D, and then using the
arrows, control-A, and control-B to make




- 5 -

---------------------------------------------------------------------

the desired changes.  The right arrow will copy characters into the
new version of the line.  Control-A will skip over characters you
wish to omit, and control-B will back up the cursor so you can insert
new characters.  To change characters on a one-for-one basis, simply
type over the top of the old ones.  When you are through, hit the
RETURN key.

Another way to edit a line is to re-type the entire line. The new
version will replace the old one with the same line number.

S-C ASSEMBLER II implements one additional editing feature,
tabulation.  The control-I key will cause enough blanks to be entered
to tab over to the next tab stop.  Tab stops are preset at columns
12, 16, and 26.  (See Appendix A for instructions on changing the tab
stops to different values.)


Listing Control Commands


FAST Command:  Sets the listing speed to the normal~toofast-to-read
speed.  It also turns off the printer software if it was on.  When
you first enter S-C ASSEMBIR II, it is already in the FAST mode.  If
you abort a listing or assembly by hitting the RETURN key, the system
returns to the FAST mode.


SLOW Command:  Sets the listing speed slow enough that you can read it
as it goes by on your screen.  It also turns off the printer software
if it was on.


PRT Command:  Turns on the printer software.  All output will be sent
to the printer as well as to the TV screen.  S-C ASSEMBLER II
includes a printer driver for the Practical Automation DMTP-6uP
printer, connected through the game i/o connector.  You can easily
substitute your own printer software in its place (See Appendix C for
details).  If you have the Apple parallel or serial printer interface
boards, you use the PR#slOt command to turn on y~ur printer instead
of the PRT command.





- 6 -

---------------------------------------------------------------------

Object Commands


ASM Command:  Initiates assembly of your source program. S-C ASSEMBLER
II is a two-pass assembler.  During the first pass it builds a symbol
table with the definition of every label used in your program.
During the second pass the assembler stores object code into memory
and produces an assembly listing.  At the end of the second pass a
list of all the labels and their definitions is produced.  The
symbols are listed in the same order in which they were defined.

If any errors are detected during either pass, an error message will
be printed.  The message will briefly explain the nature of the
error, and indicate the line number of the bad line.  All of these
messages abort the assembly process, so that you can fix them
immediately and re-start the assembly.

The assembly listing can be momentarily interrupted and restarted by
using the space bar, just as with the LIST command.  You can also
abort the assembly during pass two by hitting the RETURN key.


MGO Command:  Begins execution of your object program.  An expression
(see OPERAND EXPRESSIONS later in this manual) must follow the MGO
command to define the place to begin execution.  For example, '1MGO
BEGIN" will cause execution to begin at the point in your program
where the label BEGIN is defined.  Your program can return to S-C
ASSEMBLER II either by using an '1RTS" instruction, or by a "JMP
~1OO5." You may also abort your program by hitting the RESET key1 and
then use iOO3G in the monitor to return to the assembler system.

Note: A source program MUST be assembled using the ASM command before
it can be executed with the MGO command:

The MGO command is named "MGO" rather than "RUN" due to a naming
conflict with Apple DOS.






- 7 -

---------------------------------------------------------------------

Tape Commands

Three commands are included in S-C ASSEMBLER II to allow you to
maintain source programs on cassette tape.

LOAD Command:  Deletes the current source program, if any, and then
reads in a new one from cassette tape.  It works exactly the same as
the LOAD command in BASIC.

SAVE Command:  Writes the source program in memory on cassette tape.
It works exactly the same as the SAVE command in BASIC.

JOIN Command:  Reads a program from cassette tape and positions it in
front Qf a program already in memory. The JOIN command allows you to
join two programs into one. JOIN does not renumber the lines, and
does not re-sort the lines of the combined program into line-number
order. After the JOIN is complete, you should first delete any excess
lines (such as the ".EN" from the newly-read portion), and then use
the RENUMBER command to assign new line numbers to all the lines.

The JOIN command is named "JOIN" rather than "APPEND" due to a naming
conflict with Apple DOS.


DOS COMMANDS

All the Apple DOS commands are valid, even though you are operating
from within S-C ASSEMBLER II.  This feature allows you to maintain
your source and object programs on disk using the LOAD, SAVE, BLOAD,
and BSAVE commands.  Source programs will be entered into the disk
catalog with a type code of "I", just as though they were Integer
BASIC programs.

Be sure to avoid typing the "RUN filename" command, because it will
be recognized by DOS as an attempt to load and execute an Integer
BASIC or Applesoft program.  However, since the DOS links have been
set up for S-C ASSEMBLER II, the program will not execute.  It will
just clobber any source program you may have had in memory!





- 8 -

---------------------------------------------------------------------

Housekeeping Commands: The Apple DOS housekeeping commands (INIT,
CATALOG, RENAME, DELETE, LOCK, UNLOCK, VERIFY, NON, NOMON, and
MAXFILES) can be used as you desire.  They will function exactly the
same within S-C ASSEMBLER II as they do within BASIC.

Source Maintenance Commands: The LOAD and SAVE commands when used
with a file name will be interpreted by DOS.  If no file name is
included, S-C ASSEMBLER II will interpret them as cassette tape
commands.  As mentioned before, you should not use the RUN command
when you are inside S-C ASSEMBLER II, or you will just lose your
current source program.  (Same thing goes for the CHAIN command.)

Object Maintenance Commands: The BSAVE, BLOAD, and BRUN commands may
be used to maintain object programs on the disk and to execute them.
Be careful when using BLOAD and BRUN that the program you are loading
does not load on top of anything you want to keep!

I/O Selection Commands: The PR#, IN#, and EXEC commands may be used
from within S-C ASSEMBLER II.  PR# is used to turn on the standard
Apple parallel or serial printer interface cards.  EXEC could be used
in many ways; one use might be to load a source program created by
some other editor as a text file (type code "T") on the disk.  The
IN# command will virtually be ignored, because the line input routine
inside S-C ASSEMBLER II resets input to keyboard before every line is
read.

BASIC Commands: The INT and FP commands may be used to exit the S-C
ASSEMBLER II and enter Integer BASIC or Apple soft.












- 9 -

---------------------------------------------------------------------

MONITOR COMMANDS

All of the Apple II Monitor commands are available from within S-C
ASSEMBLER II.  You use them by typing a dollar sign ($) after the
prompt symbol, followed by the monitor command you wish to use.  This
is the same feature available in the Apple

II  Mini-Assembler.

Apple II Monitor commands are explained on pages 68-71 of the red
Apple II Reference Manual.  Withthem you may examine, change, move,
verify memory; read and write cassette tapes; dis-assemble machine
language programs; execute programs; call the mini-assembler and
assemble some 6502 code; perform hexadecimal arithmetic;~and monitor
program execution for debugging purposes.  The fact that all these
commands may be used without leaving the S-C ASSEMBLER II system
greatly increases the facility with which you can develop and debug
assembly language programs.

        :$4A.4D CA.CD
        004A- 00 1D 00 96
        00CA- 62 88 00 08

        :$1000L
        1000-   4C 1B 10    JMP     $101B
        1003-   AD 81 C0    LDA     $C081
        1006-   20 0F 10    JSR     $100F
        1009-   4C 29 10    JMP     $1029
        100C-   20 AD E5    JSR     $E5AD
        100F-   A9 1D       LDA     #$1D
        1011-   85 4B       STA     $4B
        1013-   A9 00       LDA     #$00
        1015-   85 4A       STA     $4A
        1017-   AA          TAX
        1018-   81 4A       STA     ($4A,X)
        101A-   60          RTS
        101B-   20 D7 13    JSR     $13D7
        101E-   20 58 FC    JSR     $FC58
        1021-   20 0C 10    JSR     $100C
        1024-   A0 00       LDY     #$00
        1026-   20 F9 12    JSR     $12F9
        1029-   A9 B2       LDA     #$B2
        102B-   A0 1C       LDY     #$1C
        102D-   20 D1 11    JSR     $11D1



- 10 -

---------------------------------------------------------------------

SOURCE PROGRAM FORMAT


Source programs are entered a line at a time, with a four-digit line
number identifying each line.  The line numbers may run from 0000
through 9999, and leading zeroes on numbers less than 1000 must be
typed.  Source program lines are kept sorted in line-number order;
the numbers are used for editing purposes, just as in BASIC.  A blank
must always follow the line number.  After the blank, there are four
fields of information: the label, opcode, operand, and comment
fields.  Adjacent fields must be separated by at least one blank.

Although the fields are not restricted to begin in any particular
columns, it is convenient to enter them in this way for neatness.
Therefore tab stops are built in to the S-C ASSEMBLER II at columns
12, 16, and 26.  When you type the control-I character, blanks will
be printed until the next tab stop is reached.  If you are already at
the column right before a tab stop, the next tab stop will be skipped
over and blanks will be printed up to the second tab stop. For
information about changing the tab stops to different columns, see
Appendix A.

Label Field: May be left blank, or may contain a label of from one to
six characters.  The first character of a label must be a letter;
remaining characters may be either letters or numbers.  Labels are
used to name places in your program to which you will branch, as well
as constants and variables.

The standard tab settings leave enough room for only four-character
labels; however, you can go ahead and use six characters as long as
there is at least one space between the label and the opcode.  If you
like, you may type labels on a separate line, with the opcode and
following fields left blank.  The label will be defined as the
current value of the location counter.  There aresome examples of
this in the file on the S-C ASSEMBLER II disk named "SAMPLE.SOURCE".





- 11 -

---------------------------------------------------------------------

Opcode Field: Contains a three-letter machine language mnemonic
opcode, an assembler directive, or a SWEET-16 mnemonic opcode.  If
you are using the tab stops, the opcode field normally starts in
column 12.  However, opcodes may begin in any column after at least
one blank from a label or two blanks from a line number.

S-C ASSEMBLER II uses the standard 6502 instruction mnemonics, which
are listed in the Apple II Reference Manual on pages 100-105.
Assembler directives and SWEET-16 opcodes are discussed later in this
manual.

Operand Field: Usually contains an operand expression of some sort.
Some of the 6502 instructions have no written operand, such as NOP,
BRK, DEX, and others.  In these cases the comment field may be
started right after the opcode. Four of the opcodes (ROL, ROR, ASL,
and ASR) may be used both with and without an operand.  If no operand
is present, you must type at least two blanks before a comment with
these four opcodes.

Comment Field: Comments are separated from the operand field by at
least one blank.  For your convenience, a tab stop for comments is
set at column 26.  In the assembly listing, they will start at column
~1, which is the beginning of the next line on your TV screen.
Actually comments may begin earlier or later on the line, just so at
least one blank separates them from the operand expression.

Comment Lines: Full lines of comments may be entered by typing an
asterisk (*) in the first column of the label field. This type of
comment is useful in separating various routines from each other, and
labeling their contents.  It is analogous to the REM statement in
BASIC.

Lines which are completely blank are also treated as comments.









- 12 -

---------------------------------------------------------------------

Samp1e Source Program

1000 *
1010 *    MONITOR CALLS
1020 *
1030 DLAY .EQ $FCA8     DELAY SUBROUTINE
1040 COT1 .EQ $FDF0     CHARACTER OUTPUT
1050 SOFT .EQ $3D0      DOS SOFT RE-ENTRY
1060 IOHOOK .EQ $3EA    DOS I/O HOOK ROUTINE
1070 *
1080 *    I/O ADDRESSES
1090 *
1100 KEY  .EQ $C000     KEYBOARD INPUT
1110 KEYS .EQ $C010     KEYBOARD STROBE
1120 *
1130 *    SET UP SLOW-LIST
1140 *
1150 SLOW LDA #SLOLST   PUT POINTER IN OUTPUT VECTOR
1160      STA $36
1170      LDA /SLOLST
1180 SLS1 STA $37
1190      JMP IOHOOK    GET DOS TO HOOK IT IN
1200 *
1210 *    SET UP FAST-LIST
1220 *
1230 FAST LDA #FSTLST
1240      STA $36
1250      LDA /FSTLST
1260      BNE SLS1
1270 *
1280 *    SLOW-LIST ROUTINE
1290 *
1300 SLOLST
1310      CMP #$8D      IS IT CR?
1320      BNE SLW4      NO, SO PRINT IT
1330      LDA #0        YES, SO SLOW DOWN
1340      JSR DLAY      MONITOR DELAY ROUTINE
1350 SLW1 LDA KEY       CHECK IF KEY TYPED
1360      BPL SLW3      NO, OUTPUT CR
1370      STA KEYS      YES, CLEAR STROBE
1380      CMP #$8D      IS IT CR?
1390      BEQ SLW5      YES, SO ABORT
1400 SLW2 LDA KEY       NO, SO SUSPEND
1410      BPL SLW2      WAIT FOR KEY
1420      STA KEYS      CLEAR STROBE
1430      CMP #$8D      IS IT CR?
1440      BEQ SLW5      YES, SO ABORT
1450 SLW3 LDA #$8D      OUTPUT CR
1460 SLW4 JMP COT1      MONITOR CHAR OUTPUT
1470 SLW5 JMP SOFT      ...ABORT...
1480 *
1490 *    FAST-LIST ROUTINE
1500 *
1510 FSTLST
1520      CMP #$8D      IS IT CR?
1530      BNE SLW4      NO, SO KEEP LISTING
1540      BEQ SLW1      YES; SO CHECK FOR KEYS
1550      .EN



- 13 -

---------------------------------------------------------------------



---------------------------------------------------------------------

ASSEMBLER DIRECTIVES


Seven assembler directives are available in S-C ASSEMBLER II to
control the assembly process and to define data in your programs.
These are all indicated by a three-character mnemonic, in the form of
a period followed by two letters.

    .OR     ORigin
    .TA     Target Address
    .EN     ENd of program
    .EQ     EQuate
    .DA     DAta
    .AS     Ascii String
    .HS     Hex String


Origin:             .OR expr

Sets the program origin and the target address to the value of the
expression.  Program origin is the address at which the object
program will be executed.  Target address is the memory address at
which the object program will be stored during the assembly.  The .OR
directive sets both of these to the same value, which is the normal
way of operating.  If you do not use the .OR directive, the assembler
will set both the program origin and the target address to $0800.  If
the "expr" is not defined during pass one prior to its use in the .OR
directive, an error message is printed and assembly is aborted
(***UNDEF AT LINE ....).


Target Address:     .TA expr

Sets the target address at which object code will be stored during
assembly.  The target address is distinct from the program origin
(which is either set by the .OR directive, or is implicitly set to
$0800).  The .OR directive sets both the origin and the target
address; the .TA directive sets only the target address.  Object code
is produced ready to run at the program origin, but is stored
starting at the target address.




- 15 -

---------------------------------------------------------------------

When you wish to assemble a program which will execute at an address
normally occupied by the assembler ($1000 through $1CFF)*, the symbol
table ($1D00 *up), or the source program text (bottom of DOS down),
you need to use the .TA and .OR directives.  Set the origin first,
using the .OR directive; then set the target address to a safe value
using the TA directive.  It is always safe to start the target area
at $0800, providing your object code does not extend beyond $0FFF.


    :ASM

                    1000 *     SAMPLE PROGRAM TO ILLUSTRATE
                    1010 *     THE ".TA" DIRECTIVE
                    1020      .OR $1000
                    1030      .TA $0800
    1000- AD 0C 10  1040 DEMO LDA AVALUE
    1003- AE 0D 10  1050      LDX XVALUE
    1006- AD 0E 10  1060      LDY YVALUE
    1009- 4C 00 10  1070      JMP DEMO
                    1080 *
    100C- 0C        1090 AVALUE .DA #12
    100D- 22        1090 XVALUE .DA #34
    100E- 38        1090 YVALUE .DA #56

    SYMBOL TABLE

    DEMO    1000    AVALUE  100C    XVALUE  100D
    YVALUE  100E

As you can see in the example, the assembly listing looks as though
the program were stored at $1000.  However, the object code is
actually stored at $0800, which is the target address set in the .TA
directive.  If we dis-assemble memory starting at $0800, we see:

:$800L

0800-   AD 0C 10    LDA     $100C
0803-   AE 0D 10    LDX     $100D
0806-   AC 0E 10    LDY     $100E
0809-   4C 00 10    JMP     $1000
080C-   0C          ???
080D-   22          ???
080E-   38          SEC


* ASMDISK ends at $1CFF, symbols start at $1D00. ASMDISK (AUTOSTART)
ends at $1DFF, symbols start at $1E00.  ASMDISK (APPLE II PLUS) ends
at $1FFF, symbols start at $2000.

- 16 -

---------------------------------------------------------------------

After the assembly is complete, there are several ways to position
the code in memory where it really should be.  You can save the
object code on cassette or disk from its current location, and
re-load it later at the correct location for execution.  Be sure you
do not try to reload it while you are executing the assembler, or you
may clobber it!

Another method is to hit RESET and use the monitor memory move
command ( addrl addr2.addr3M ).  This command will move the block of
memory from addr2 through addr3 to the area beginning at addri.

If you need a larger safe area than that given between $0800 and
$0FFF, you can patch the assembler at location $1010.  This location
currently contains $1D, which is the page number of the start of the
assembler's symbol table.  If you change this value to $30, for
example, the symbol table will start at $3000 instead of $1D00.  This
will leave the area from $1D00 through $2FFF free for a target area.
To be effective, this change should be made before using the ASM
command.  Be sure to leave enough room between the start of the
symbol table and the bottom of DOS for all of your source program as
well as the symbol table.


End of Program:     .EN

Defines the end of the source program.  You would normally make this
the last line, but you may place it earlier in order to assemble only
a portion of your source program.  If no .EN is present anywhere in
your program, the assembler will assume you meant to put one after
the last line.  (This is different from most assemblers, which for
some strange reason go completely crazy if the .EN directive is
missing!)







* These values are correct for ASMDISK.  For ASMDISK (AUTOSTART) the
values are $1E and $1E00.  For ASMDISK(APPLE II PLUS) the values are
$20 and $2000.

- 17 -

---------------------------------------------------------------------

Equate:     label .EQ expr

Defines the label to have the value of the expressione If the
expression is not defined, an error message is printed (***UNDEF AT
LINE xxxx).  If you neglect to use a label with an equate directive,
an error message is printed also (***NO LABEL AT LINE xxxx).  In
either case, the assembly is aborted so that you can repair the
error.  One common use for this directive is to define all the
page-zero variables your program uses.


                    1000 ACC    .EQ $45
                    1010 IN     .EQ $0200   INPUT BUFFER
                    1020 ACL    .EQ $50
                    1030 ACH    .EQ ACL+1
                    1040 PDL0   .EQ $C064   PADDLE 0

    SYMBOL TABLE

    ACC     0045    IN      0200        ACL     0050
    ACH     0051    PDL0    C064




Data:       label .DA expr  (two bytes, LSB first)
            label .DA #expr (one byte, LSB of expr)
            label .DA /expr (one byte, MSB of expr)

Creates a constant or variable in your program.  The value of the
expression, as one or two bytes, is stored at the current location.
If a label is present, it is defined as the address where the first
byte of data is stored.  (If you use .DA to define a variable, it is
a good habit to use an expression like "*-*", which has a value of
zero.  This weird expression will make your program more
self-explanatory when you look at it again next year.)


                    1000 IN   .EQ $0200     INPUT BUFFER
    0800- E8 03     1010 TEN3 .DA 1000
    0802- 64 C0     1020 PDL0 .DA $C064     PADDLE 0 ADDRESS
    0804- C1        1030 LTRA .DA #$C1      ASCII LETTER A
    0805- 02        1040 BFPG .DA /IN       BUFFER PAGE

    SYMBOL TABLE

    IN      0200    TEN3    0800    PDL0    0802
    LTRA    0804    BFPG    0805



- 18 -

---------------------------------------------------------------------

Hex String:     label .Hs hhh...h

Converts a string of hex digits (hhh...h) to binary, two digits per
byte, and stores them starting at the current location.  If a label
is present, it is defined as the address where the first byte is
stored.  If you do not have an even number of hexadecimal digits, the
assembler aborts with an error message (***BAD ADDRESS AT LINE xxxx).

NOTE: Unlike hexadecimal numbers used in operand expressions, you
must not use a dollar sign with the .HS directive.

A funny feature of this assembler is that the source line will print
together with the last line of bytes produced by the hex string
directive.  Do not let this confuse you.

    0800- F1        0900      .HS F1
    0801- 23 AB 45  1000 STR  .HS 23AB45
    0804- 01 23 45
    0807- 67 89 AB
    080A- CD EF     1100 QT   .HS 0123456789ABCDEF

    SYMBOL TABLE

    STR     0801    QT      0804



Ascii String:   label .AS daaa...ad

Stores the binary form of the ASCII characters "aaa...a" in
sequential locations beginning at the current location.  If a label
is present, it is defined as the address where the first character is
stored.  The string "aaa...a" may contain any number of the printing
ASCII characters.  You indicate the beginning and end of the string
by any delimiter !1d11 that you choose.

ASCII character codes are seven bit values.  The .AS directive
normally sets the high-order, or 8th, bit to zero.  Some people like
to use ascii codes with the high-order bit set to one, so S-C
ASSEMBLER II includes an option for this.

    .AS daaa...d     sets the high-order bits to 0
    .AS -daaa...d    sets the high-order bits to 1

This syntax restricts the choice of the delimiter slightlys it may be
any printing character other than space and minus.



- 19 -

---------------------------------------------------------------------



    0800- 53 54 52
    0803- 49 4E 47  1000 STR  .AS "STRING"    DELIMITER IS "
    0806- 22 22 22  1010 QT   .AS /"""/       DELIMITER IS /
    0809- C8 D5 C8
    080C- BF        1020 HUH  .AS -QHUH?Q     DELIMITER IS ?

    SYMBOL TABLE

    STR     0800    QT      0806    HUH     0809










































- 20 -

---------------------------------------------------------------------

OPERAND EXPRESSIONS


Operand expressions are written using terms and operators. The valid
operators are + and -.  Terms may be decimal numbers1 hexadecimal
numbers, labels, or an asterisk (*).  The first term in an expression
may be preceded by a + or - sign.

Decimal Numbers: Any number in the range from 0 through 65535,
written in the normal way.

    0800- A9 C8     1000      LDA #200
    0802- A2 F6     1010      LDX #-10
    0804- 6B 8B     1020      .DA 35691
                    1030 FLAG .EQ -1


Hexadecimal Numbers: Any number in the range from $0 through $FFFF.
Hexadecimal numbers are indicated by a preceding dollar sign, and may
have from one to four digits.

                    1050      .OR $880
    0880- A9 2F     1060      LDA #$2F
    0882- 85 CA     1070      STA $CA
    0884- D0 1D     1080      BNE $8A3
    0886- 20 2A E0  1090      JSR $E02A
                    1100 VALL .EQ $AB
                    1110 NUM  .EQ $1278
                    1120 CONV .EQ $E59B

Beware of leaving out the dollar sign; the assembler may be quite
satisfied to think of your hexadecimal number as a decimal one if you
omit the $.  In some cases even a number with letters in it, such as
23AB,may be acceptable; it may be interpreted as decimal 23 and a
comment "AB".

Labels: One to six characters; the first character must be a letter,
while the others may be either letters or digits. Labels must be
defined somewhere in the program if they are to be used in an
expression.  In some cases they must be defined prior to use in
expressions to prevent an undefined or ambiguous location counter.
For example, if the expression in the operand field of an origin
(".OR") directive is not defined prior to use, the assembler will not
know how to define any subsequent labels.





- 21 -

---------------------------------------------------------------------

A problem can occur if you postpone the definition of page-zero
variables until after their use in operand expressions.  If these
labels are used with instructions which could assume both absolute
and zero-page address modes, a discrepancy in the location count will
occur between pass one and pass two of the assembler.  (This
discrepancy cannot be detected by the present design of the
assembler, so make it a habit to always define your page-zero
variables at the beginning of your program.)

                    1000 VALL .EQ $AB
                    1010 NUM  .EQ $1905
                    1020 CONV .EQ $E59B
    0800- B5 A8     1030 LP   LDA VALL-3,X
    0802- 9D 05 19  1040      STA NUM,X
    0805- 20 9B E5  1050      JSR CONV
    0808- D0 F6     1060      BNE LP


Asterisk (*): Stands for the current value of the location counter.
This is useful for storing the length of a string as a constant in a
program.  I also use it in the expression "*-*" to indicate that a
location is a variable rather than a constant.

    080A- 0B        1070 QT   .DA #QTSZ     # BYTES IN MSG
    080B- 41 4E 59
    080E- 20 4D 45
    0811- 53 53 41
    0814- 47 45     1080      .AS /ANY MESSAGE/
                    1090 QTSZ .EQ *-QT-1    # OF BYTES IN MSG
    0816- 00 00     1100 VARW .DA *-*       2-BYTE VARIABLE
    0818- 00        1110 VARB .DA #*-*      1-BYTE VARIABLE
                    1120 HERE .EQ *


It is considered very poor programming practice to include branch
instructions in your program with operand expressions of the form
"*-5" or "*+7".  Avoid them like the plague!  They breed bugs that
can be very difficult to find.  Don't be afraid to use another label
or two, no matter how silly the names might sound.




- 22 -

---------------------------------------------------------------------

ADDRESSING MODES


The MOS Technology 6502 microprocessor used in the Apple II has many
great features; one of the greatest is its variety of addressing
modes.  There are thirteen different modes in all, though no single
opcode can use every one of them.  The charts in this chapter show
which modes can be used with each opcode.  But first, here is a chart
showing an example of each mode and the way it is written in assembly
language.  Except for one new kind, the syntax is the same as that
used by the Apple II mini-assembler.

    Mode            Example

    Implied         DEX              \  At least two
    Accumulator     ROL              /  blanks before
                                        comments begin.
    Relative        BNE expr

    Immediate       LDA #expr
                    LDA /expr
    Zero Page       LDA expr         \
    Absolute        LDA expr         |  Assembler uses
                                     |  Zero Page form
    ZeroPage,X      LDA expr,X       |  if possible;
    Absolute,X      LDA expr,X       |  if not, it uses
    Zero Page,Y     LDA expr,Y       |  Absolute form.
    Absolute,Y      LDA expr,Y       /
    (Zero Page,X)   LDA (expr,X)
    (Zero Page),Y   LDA (expr),Y
    (Absolute)      JMP (expr)


For a full explanation of the modes and how to use them, I refer you
to the MOS Technology Hardware and Programming Manuals, as well as
the other references mentioned in the bibliography in Appendix D.

S-C ASSEMBLER II has one syntactical addition over the Apple II
mini-assembler.  The immediate mode may be indicated by either a
pound sign (#) or a slash (/).  The "#" means that the least
significant byte of the 16-bit expression value should be used
(equivalent to "expr MOD 256" in BASIC).



- 23 -

---------------------------------------------------------------------

The "/" means that the most significant byte should be used
(equivalent to "expr/256" in BASIC).

One use for this feature is in setting up the address of a subroutine
or a buffer in a pointer.  (A pointer is a pair of bytes containing
an address which "points" at a subroutine or into a buffer.)  For
example:

                1000 SLOW .EQ $1C89
0800- A9 89     1010      LDA #SLOW
0802- 85 36     1020      STA $36
0804- A9 1C     1030      LDA /SLOW
0806- 85 37     1040      STA $37


is used inside S-C ASSEMBLER II to turn on the Slow-List feature when
you type the SLOW command.

Trying to comprehend and remember thirteen different addressing modes
can be very difficult; therefore it is convenient to try to group
them into categories.  I use the following breakdown: implied mode,
relative mode, and other modes. "Other" modes now includes eleven
modes, so I break it down further: accumulator, immediate, direct,
and indirect modes.  Each of direct and indirect modes may be either
indexed or not indexed, and either zero page or Absolute.  The
following outline will give you a better idea of what I am describing.


            I.   Implied

            II.  Accumulator

            III. Direct
                 A. Not Indexed
                    1.  Zero Page
                    2.  Absolute
                 B. Indexed by X-register
                    1.  Zero Page,X
                    2.  Absolute,X
                 C. Indexed by Y-register
                    1.  Zero Page,Y
                    2.  Absolute,Y

            IV. Indirect
                A. Not Indexed -- (Absolute)
                B. Indexed by X-register (Zero Page,X)
                C. Indexed by Y-register (Zero Page),Y



- 24 -

---------------------------------------------------------------------

Implied Mode: In this mode, the address is implied by the nature of
the instruction; the operand field is left blank.  All of the opcodes
in this class are only one byte long.  They are:

        BRK     DEX     PHA     RTS     TAY
        CLC     DEY     PHP     SEC     TSX
        CLD     INX     PLA     SED     TXA
        CLI     INY     PLP     SEI     TXS
        CLV     NOP     RTI     TAX     TYA


Relative Mode: This mode is used only by the conditional branch
instructions.  The expression is converted to a signed offset from
the location following the branch instruction.  The result must be in
the range from -128 through +127 to be legal.  All of these
instructions occupy two bytes.  They are:

        BCC     BEQ     BNE     BVC
        BCS     BMI     BPL     BVS


Other Modes: Usage of the other eleven modes is much more complex.
The table on the next page shows which modes are defined for each of
the remaining opcodes.  These instructions occupy one byte in the
accumulator mode, two bytes in any of the zero page modes, and three
bytes in any of the absolute modes.  They are:

        ADC     AND     ASL     BIT     CMP
        CPX     CPY     DEC     EOR     INC
        LDA     LDX     LDY     LSR     ORA
        ROL     ROR     SBC     STA     STY
        STX     JMP     JSR

You might notice especially that only four opcodes are usable in the
accumulator mode (ASL, LSR, ROL, ROR); that only two opcodes use the
"ZP,Y" mode (LDX and STX); and that only one opcode uses the
indirect absolute non-indexed mode (JMP).






- 25 -

---------------------------------------------------------------------


      ACCUM-   IMMED-  ---- D I R E C T ----    ---- I N D I R E C T ----
      ULATOR   IATE               INDEXED               INDEXED
      blank    #expr   expr    expr,X  expr,Y   (expr)  (expr,X)  (expr),Y
               /expr   ZP/ABS  ZP/ABS  ZP/ABS

ADC     --      69     65/6D   75/7D   --/79      --       61       71
AND     --      29     25/2D   35/3D   --/39      --       21       31
ASL     0A      --     06/0E   16/1E   --/--      --       --       --
BIT     --      --     24/2C   --/--   --/--      --       --       --
CMP     --      C9     C5/CD   D5/DD   --/D9      --       C1       D1
CPX     --      E0     E4/EC   --/--   --/--      --       --       --
CPY     --      C0     C4/CC   --/--   --/--      --       --       --
DEC     --      --     C6/CE   D6/DE   --/--      --       --       --
EOR     --      49     45/4D   55/5D   --/59      --       41       51
INC     --      --     E6/EE   F6/FE   --/--      --       --       --
LDA     --      A9     A5/AD   B5/BD   --/B9      --       A1       31
LDX     --      A2     A6/AE   --/--   B6/BE      --       --       --
LDY     --      AO     A4/AC   B4/BC   --/--      --       --       --
LSR     4A      --     46/4E   56/5E   --/--      --       --       --
ORA     --      09     05/0D   15/1D   --/19      --       01       11
ROL     2A      --     26/2E   36/3E   --/--      --       --       --
ROR     6A      --     66/6E   76/7E   --/--      --       --       --
SBC     --      E9     E5/ED   F5/FD   --/F9      --       E1       F1
STA     --      --     85/8D   95/9D   --/99      --       81       91
STX     --      --     86/8E   --/--   96/--      --       --       --
STY     --      --     84/8C   94/--   --/--      --       --       --

JMP     --      --     --/4C   --/--   --/--      6C       --       --
JSR     --      --     --/20   --/--   --/--      --       --       --


- 26 -

---------------------------------------------------------------------

SWEET-16


SWEET-16 is the little 16-bit interpreter Steve Wozniak wrote, which
is hidden inside your Apple Integer BASIC ROM's.  He described it
fully in BYTE Magazine, November, 1977, pages 150-159: "SWEET-16 --
The 6502 Dream Machine". The same article is available directly from
Apple, or in one of the many editions of the "WOZPAK".

Many people have begged me to include the ability to assemble code
for SWEET-16 in the S-C ASSEMBLER II, so I have now done so.  (It is
included in versions 3.2 and later.)  I have implemented the same
mnemonics and syntax which Steve Wozniak described in the article.

The beauty of SWEET-16 is in its ability to perform 16-bit arithmetic
and data moves using automatically updated address pointers.  And to
add icing to the cake, most of the instructions are only one byte
long!  You can write extremely compact code, if you are willing to
pay the price of slower execution.  Portions of S-C ASSEMBLER II are
coded in SWEET-16; these include the RENUMBER command processor and
the opcode table search routine.

SWEET-16 is invoked by the instruction "J5R $F689", and the bytes
immediately after this instruction should contain opcodes for
SWEET-16 to process.  If you are serious about wanting to learn to
use SWEET-16, locate the article and start studying.

    1n lo hi    SET  n,addr         01 ea   BR   addr
    2n          LD   n              02 ea   BNC  addr
    3n          ST   n              03 ea   BC   addr
    4n          LD   @n             04 ea   BP   addr
    5n          ST   @n             05 ea   BM   addr
    6n          LDD  @n             06 ea   BZ   addr
    7n          STD  @n             07 ea   BNZ  addr
    8n          POP  @n             08 ea   BM1  addr
    9n          STP  @n             09 ea   BNM1 addr
    An          ADD  n              0C ea   BS   addr
    Bn          SUB  n
    Cn          POPD @n             00      RTN
    Dn          CPR  n              0A      BK
    En          INR  n              0B      RS
    Fn          DCR  n

* This is the address of SWEET-16 in the Integer BASIC ROM. If you
are using ASMDISK (APPLE II PLUS), SWEET-16 begins at $1D89, inside
the assembler.

- 27 -

---------------------------------------------------------------------


                    1000      .OR $11DE
                    1010      .TA $0800
                    1180 HIMM .EQ $4C      TOP OF SOURCE
                    1410 SW16 .EQ $F689    SWEET-16
                    4080 *
                    4090 *    RENUMBER COMMAND
                    4100 *
    11DE- 20 89 F6  4110 REN  JSR SW16      CALL SWEET-17
    11E1- 11 CA 00  4120      SET 1,PP      POINT AT PP
    11E4- 61        4130      LDD @1        GET PP
    11E5- 31        4140      ST  1         (R1)=PP
    11E6- 12 0A 00  4150      SET 2,10      INCREMENT = 10
    11E9- 13 4C 00  4160      SET 3,HIMEM   POINT AT HIMEM
    11EC- 63        4170      LDD @3        GET HIMEM
    11ED- 33        4180      ST  3         (R3)=HIMEM
    11EE- 14 DE 03  4190      SET 4,990     START=990
    11F1- 21        4200 REN1 LD  1         TEST IF THRU
    11F2- D3        4210      CPR 3
    11F3- 03 0E     4220      BC  REN2      FINISHED
    11F5- 41        4230      LD  @1        GET # BYTES
    11F6- 35        4240      ST  5         SAVE FOR LATER
    11F7- 24        4250      LD  4         GET SEQ. NO.
    11F8- A2        4260      ADD 2         ADD INCREMENT
    11F9- 34        4270      ST  4         STORE NEXT SEQ. NO.
    11FA- 71        4280      STD @1        PUT SEQ: NO. IN
    11FB- F1        4290      DCR 1         BACK UP POINTER
    11FC- F1        4300      DCR 1
    11FD- F1        4310      DCR 1
    11FE- 21        4320      LD  1         MOVE TO NEXT
    11FF- A5        4330      ADD 5
    1200- 31        4340      ST  1
    1201- 01 EE     4350      BR  REN1
    1203- 00        4360 REN2 RTN
    1204- 60        4370      RTS

    SYMBOL TABLE

    HIMM    004C    SW16    F689    REN     11DE
    REN1    11F1    REN2    1203





- 28 -

---------------------------------------------------------------------

APPENDIX A


Operation and Memory Usa~e

Version 3.2 of S-C ASSEMBLER II is a disk-based version, and is
supplied on an Apple DOS 3.2.1 Master Disk.

Contents of the Disk: The disk contains standard Apple DOS 3.2.1, and
seven files.  When you boot the disk, if your Apple has Integer BASIC
ROMs, the following catalog will print:

        S-C ASSEMBLER II -- DISK VERSION 3.2
        COPYRIGHT JUNE #), 1979

        DISK VOLUME 001

        I 002 HELLO
        B 015 ASMDISK
        I 008 SAMPLE.SOURCE
        I 011 APPLE-TALKER
        I 003 USEFUL INFORMATION (BASIC)
        B 016 ASMDISK (AUTOSTART)
        B 018 ASMDISK (APPLE II PLUS)

(If your Apple does not have Integer BASIC in ROM, or in RAM with the
Pascal Language System, you will get the message "LANGUAGE NOT
AVAILABLE" instead of a catalog when you boot the disk.  Don't worry
about this; just type the CATALOG command and you will get one.  You
can change the HELLO program to an Applesoft version later.)

The three files with names containing "ASMDISK" are three versions of
the S-C ASSEMBLER II, for the three different configurations of Apple
II computers.  If you have an Apple II with the standard monitor ROM
and with Integer BASIC, you can use the shortest version: ASMDISK.
If you have Integer BASIC either in ROM or in the Pascal System RAM
board, with the Autostart Monitor ROM, use the next version: ASMDISK
(AUTOSTART). If you do not have Integer BASIC at all, usethe version
called ASMDISK (APPLE II PLUS).  SAMPLE.SOURCE and APPLE-TALKER are
not Integer BASIC programs.  They are sample assembly language
programs, and are described on page A-4 in this appendix.

When you have decided which version of the assembler you are going
to use, simply BRUN the file.  (ASMDISK (APPLE II PLUS) must be
BRUNned from Applesoft; the other two versions must be BRUNned from
Integer BASIC.)

    >BRUN ASMDISK   or   >BRUN ASMDISK (AUTOSTART)
    >BRUN ASMDISK (APPLE II PLUS)

A - 1

---------------------------------------------------------------------

Memory Usage: The S-C ASSEMBLER II program is 3328* bytes long, and
resides from $1000 through $1CFF* in memory.  To operate, you need at
least a 24K Apple; remember that Apple DOS uses over 10K for itself.

Your source program is stored with the highest numbered line at the
high end of memory (right under DOS).  The lines are kept in
numerical order, the same way as Apple BASIC does it. Locations $CA
and $CB contain the address of the beginning of the source program.
During assembly, a symbol table is built.  It begins at $1D00 and
grows toward the source program.  (If they meet you get *** MEM FULL
ERR.)

The assembler stores your object code wherever you direct it with the
".OR" or ".TA" directives.  If you do not use either of these, the
object code will be stored starting at $0800.  You should be careful
not to direct the object code on top of the assembler, your source
program, or the symbol table!

Many locations in page zero are used during editing and assembly.
The only ones which must be protected while you execute your object
program are $4A through $4D and $CA through $CD.  The high end of
page one is used as a stack (6502 hardware feature).  The low end of
page two is used as an input buffer (Apple Monitor input routine).

















* The values are correct for ASMDISK.  For ASMDISK (AUTOSTART) the
values are 3584, $1DFF, and $1E00.  The values for ASMDISK (APPLE II
PLUS) are 4096, $1FFF, and $2000.

A - 2

---------------------------------------------------------------------

    ROM USAGE

    Address         Purpose
    E02A         *  Get next byte through $E2,E3
    E372         *  Delete range of lines
    E38A         *  Locate and delete source line
    E3C4         *  Print quote from page $EB00
    E523         *  Print line number
    E56D,E576    *  Locate source line
    EED3         *  Print error message
    F115         *  Print "ERR"
    F11E,F12C    *  Set up for LOAD command (cassette)
    F137         *  Decrement limit
    F140         *  SAVE command (cassette)
    F689         *  SWEET-16 Interpreter
    FB63         *  16-bit multiply
    FC30            Handle screen-editing characters
    FCA8            Delay
    FC58            Clear screen
    FD0C            Character input
    FD1B            Keyboard input
    FD67            Read input line
    FD9E            Print minus sign.
    FDDA            Print (A-register) in hexadecimal
    FDED,FDF0       Character output
    FE00            Display memory in hexadecimal
    FEFD            Cassette tape read
    FF3A            Ring bell
    FFA7            Get hexadecimal number
    FFBE            Jump into monitor command processor
    FFC7            Clear mode byte
    FFCC            Table of monitor commands



* These routines are not referenced by the Apple II Plus version of
S-C ASSEMBLER II.  Also, the routine at FB63 is not referenced from
the Autostart ROM version.




A - 3

---------------------------------------------------------------------

Sample Source Programs: Two sample source programs have been included
on the S-C ASSEMBLER II disk.  These are intended to illustrate a few
of the neat features of S-C ASSEMBLER II. However, they have
functional value as well.

APPLE-TALKER consists of three programs.  The first, "RCRD", simply
echoes through the Apple speaker whatever it hears at the cassette
input port.  If you play a tape that you have previously recorded you
voice on, and adjust the volume control until it sounds best, you can
hear the Apple's rendition of your voice.  (It is interesting to try
this with other sounds as well, like music.)  The second program,
"READ", is similar; however, it not only listens to the cassette
input port, but also stores the bits in a big buffer.  The third
program, "TALK", plays back all the bits from the big buffer.  You
can use the basic techniques out of these programs to build some
really fancy frills for your game and demo routines.

SAMPLE.SOURCE contains a subroutine similar to my "SLOWLIST" program,
which was published in MICRO (July, 1978).  The difference is that
this version works with DOS 3.2.  It is very similar to the speed and
suspension control I have included in S-C ASSEMBLER II.

Useful Information: The last file on the S-C ASSEMBLER II disk is
called "USEFUL INFORMATION (BASIC)".  This is a BASIC program which
will BLOAD the assembler and look into certain locations to determine
the current values of the tab stops and the RENUMBER base and
increment.  It will then print the data out in a nice little report.
If you make some changes to any of these parameters, this program
could keep you straight as to which version is which.  Of course you
can also glean from the program just where these items of information
are kept inside the assembler.

A - 4

---------------------------------------------------------------------

Handy Patches: Many customers have requested patches for the tab
stops, and for the RENUMBER parameters.  In the current release of
S-C ASSEMBLER II (Disk Version 3.2), the locations to change are as
follows:

    11EF,11F0   (DE 03)     base - increment (99010)
    11E7,11E8   (0A 00)     increment
    13A1        (09)        first tab stop   \
    13A5        (0D)        second tab stop  |  column number
    1394        (17)        third tab stop   /  minus three
    1390        (89)        tab control character (Ic)

Some customers have complained about the disappearance of the
assembler's symbol table after RESET and soft re-entry.  You can
re-establish all the assembled symbols except the first one by
patching a non-zero value at $1D00 after re-entry.

































A - 5

---------------------------------------------------------------------

APPENDIX B


Error Messages


If you make a mistake, S-C ASSEMBLER II will probably catch you.
Here are the error messages you may see.

    *** SYNTAX ERROR            Misspelled command or bad line number.

    *** MEM FULL ERR            Either you do not have enough memory
                                for the source program, or for the
                                source plus the symbol table, or a
                                tape read error has occurred.

    *** RANGE ERR AT LINE xxxx  The relative offset for a branch
                                instruction was not between -128 and +127.

    *** NO LABEL AT LINE xxxx   There was no label with an equate (.EQ)
                                directive.

    *** BAD OPCODE AT LINE xxxx The characters in the opcode field are
                                not a valid opcode or directive.

    *** EXTRA DEF AT LINE xxxx  The same label was defined more than
                                once.

    *** UNDEF AT LINE xxxx      A symbol in the operand field is not
                                defined.

    *** BAD SYMBOL AT LINE xxxx A character in the label field is not
                                a legal character for a label.

    *** BAD ADDRESS AT LINE xxxx  This one is a catch-all for syntactical
                                errors in the operand expression, as well
                                as for use of a particular address mode
                                with an opcode that does not support that
                                mode.

The "xxxx" in the above error messages will be the line number of
the line with the error in it.

In all cases when an error is discovered during assembly, the error
message will be printed and then assembly will abort.  You can then
list the indicated line, repair the problem, and try again.





B - 1

---------------------------------------------------------------------

APPENDIX C


Printer Software


The PRT command turns on the self-contained printer software by
inserting its starting address at locations $36 and $37, and then
calling the IOHOOK routine in DOS at $03EA.  If you have the Apple
parallel or serial printer interface boards, you will not use the PRT
command.  Instead, you should use the DOS command PR#n to activate
your printer.

The self-contained printer software inside S-C ASSEMBLER II is
written especially for the Practical Automation DMTP-6uP printer.
This printer costs less than $700 including power supply and
controller -- a real bargain.  All it takes to interface their
controller to the Apple II is to run a twisted pair from their
controller to the game paddle connector inside the Apple II.  The
software uses one of the TTL outputs at the game connector as a 300
baud serial interface.

Some features of the printer driver deserve explanation.

The printer normally begins printing 1/4 inch from the left edge of
the paper.  PRT provides left margin control, and is set to actually
begin printing in column 11.  PRT also keeps track of the number of
lines on the page, and pauses after 56 lines so that you can insert a
new sheet of paper.  When the paper is ready, tap the space bar to
continue printing.  PRT optimizes speed to minimize the additional
delay during a carriage return.  At any time you wish to suspend or
abort printing, you use the space bar or RETURN key, just as in the
SLOW and FAST modes.

A complete listing of the PRT subroutine is included in this
Appendix.  After studying it you should be able to create a similar
subroutine for any other printer you may have. Several customers have
written to me telling of their success with interfacing the Integral
Data, Heathkit, DIABLO, and Centronics printers.  Others are using
Selectrics or Teletypes.






C - 1

---------------------------------------------------------------------

                Listing of the PRT subroutine

                1000      .OR $1C00
                1010      .TA $0800
                1020 *
                1030 *    PAGE ZERO VARIABLES
                1040 *
                1050 CH   .EQ $24       CURSOR HORIZONTAL POSITION
                1060 OLDC .EQ $F0       # CHARS PREV LINE
                1070 NEWC .EQ $F1       # CHARS THIS LINE
                1080 LNCT .EQ $F4       # LINES THIS PAGE
                1090 PRTX .EQ $F5       SAVE X
                1100 PRTY .EQ $F6       SAVE Y
                1110 *
                1120 *    ROM-BASED ROUTINES
                1130 *
                1140 DLAY .EQ $FCA8     DELAY SUBROUTINE
                1150 COT1 .EQ $FDF0     COUT AFTER USER EXIT
                1160 *
                1170 *    SOFT RETURN TO ASSEMBLER
                1180 *
                1190 SOFT .EQ $1003
                1200 *
                1210 *    PRINTER DRIVER
                1220 *
1C00- 84 F6     1230 PRNT STY PRTY      SAVE X AND Y
1C02- 86 F5     1240      STX PRTX
1C04- C9 8D     1250      CMP #$8D      IS IT CR?
1C06- D0 39     1260      BNE PRT5      NO
1C08- A4 F0     1270      LDY OLDC      YES, GET # CHARS PREV LINE
                1280 *                  WAS LONGER THAN THIS LINE
1C0A- C8        1290      INY
1C0B- A9 50     1300 PRT1 LDA #80       WAIT A WHILE
1C0D- 20 A8 FC  1310      JSR DLAY      MONITOR DELAY
1C10- 88        1320      DEY
1C11- D0 F8     1330      BNE PRT1
1C13- A9 8D     1340      LDA #$8D      OUTPUT CR
1C15- 20 66 1C  1350      JSR POUT
1C18- A5 F1     1360      LDA NEWC
1C1A- 85 F0     1370      STA OLDC
1C1C- A9 00     1380      LDA #0
1C1E- 85 F1     1390      STA NEWC
1C20- A2 0A     1400      LDX #10       LEFT MARGIN
1C22- A9 A0     1410 PRT2 LDA #$A0      TAB OVER MARGIN
1C24- 20 68 1C  1420      JSR POT0
1C27- CA        1430      DEX
1C28- D0 F8     1440      BNE PRT2
1C2A- A4 F6     1450 PRT3 LDY PRTY      RESTORE X AND Y
1C2C- A6 F5     1460      LDX PRTX
1C2E- E6 F4     1470      INC LNCT      COUNT THE LINE
1C30- A5 F4     1480      LDA LNCT      SEE IF END OF PAGE
1C32- C9 38     1490      CMP #56       # LINES PER PAGE
1C34- 90 5C     1500      BCC SLW1      NOT END, JOIN FAST LIST
1C36- A9 8D     1510      LDA #$8D      YES, OUTPUT CR
1C38- 20 F0 FD  1520      JSR COT1      MONITOR OUTPUT


C - 2

---------------------------------------------------------------------

1C3B- A9 00     1530      LDA #0        CLEAR LINE COUNT
1C3D- 85 F4     1540      STA LNCT
1C3F- F0 5D     1550      BEQ SLW2      JOIN SUSPEND, WAIT FOR KEY
                1560 *
1C41- A4 F0     1570 PRT5 LDY OLDC      NOT END OF LINE YET
1C43- F0 02     1580      BEQ PRT6      PAST PREVIOUS LINE
1C45- C5 F0     1590      DEC OLDC
1C47- 48        1600 PRT6 PHA           SAVE CHAR
1C48- A5 F1     1610 PRT9 LDA NEWC      SEE IF LINE FULL
1C4A- C9 46     1620      CMP #70       80-CHAR LINE
1C4C- B0 10     1630      BCS PRT7      IGNORE IF EXCESS
1C4E- C5 24     1640      CMP CH        SEE IF NEED TAB
1C50- B0 07     1650      BCS PRT8      NO
1C52- A9 A0     1660      LDA #$A0      SEND BLANKS
1C54- 20 66 1C  1670      JSR POUT      TO CATCH UP TO TAB
1C57- F0 EF     1680      BEQ PRT9      ...ALWAYS
1C59- 68        1690 PRT8 PLA
1C5A- 48        1700      PHA
1C5B- 20 66 1C  1710      JSR POUT      PRINT IT
1C5E- 68        1720 PRT7 PLA           RESTORE CHAR
1C5F- A4 F6     1730      LDY PRTY      RESTORE X AND Y
1C61- A6 F5     1740      LDX PRTX
1C63- 4C F0 FD  1750      JMP COT1      MONITOR OUTPUT
                1760 *
                1770 *    PRINTER OUTPUT -- 300 BAUD
                1780 *
1C66- E6 F1     1790 POUT INC NEWC      COUNT THE CHAR
1C68- A0 0A     1800 POT0 LDY #10       # BITS TO SEND
1C6A- 18        1810      CLC           SET UP FOR START BIT
1C6B- 48        1820 POT1 PHA           SAVE CHAR
1C6C- B0 05     1830      BCS POT2      1-BIT, SEND MARK
1C6E- AD 59 C0  1840      LDA $C059     SPACE
1C71- 90 03     1850      BCC POT3
1C73- AD 58 C0  1860 POT2 LDA $C058     MARK
1C76- A9 4D     1870 POT3 LDA #77       TIMING LOOP FOR 300 BAUD
1C78- 48        1880 POT4 PHA
1C79- A9 20     1890      LDA #$20
1C7B- 4A        1900 POT5 LSR
1C7C- 90 FD     1910      BCC POT5
1C7E- 68        1920      PLA
1C7F- E9 01     1930      SBC #1
1C81- D0 F5     1940      BNE POT4
1C83- 68        1950      PLA           GET CHAR (CARRY IS SET)
1C84- 6A        1960      ROR           NEXT BIT INTO CARRY
1C85- 88        1970      DEY
1C86- D0 E3     1980      BNE POT1      SEND NEXT BIT
1C88- 60        1990      RTS
                2000 *
                2010 *    SLOW-LIST ROUTINE
                2020 *
1C89- C9 8D     2030 SLST CMP #$8D      IS IT CR?
1C8B- D0 1F     2040      BNE SLW4      NO, SO PRINT IT
1C8D- A9 00     2050      LDA #0        YES, SO SLOW DOWN
1C8F- 20 A8 FC  2060      JSR DLAY      MONITOR DELAY ROUTINE
1C92- AD 00 C0  2070 SLW1 LDA $C000     CHECK IF KEY TYPED
1C95- 10 13     2080      BPL SLW3      NO, OUTPUT CR


C - 3

---------------------------------------------------------------------

1C97- 8D 10 C0  2090      STA $C010     YES, CLEAR STROBE
1C9A- C9 8D     2100      CMP #$8D      IS IT CR?
1C9C- F0 11     2110      BEQ SLW5      YES, SO ABORT
1C9E- AD 00 C0  2120 SLW2 LDA $C000     NO, SO SUSPEND
1CA1- 10 FB     2130      BPL SLW2      WAIT FOR KEY
1CA3- 8D 10 C0  2140      STA $C010     CLEAR STROBE
1CA6- C9 8D     2150      CMP #$8D      IS IT CR?
1CA8- F0 05     2160      BEQ SLW5      YES, SO ABORT
1CAA- A9 8D     2170 SLW3 LDA #$8D      OUTPUT CR
1CAC- 4C F0 FD  2180 SLW4 JMP COT1      MONITOR OUTPUT
1CAF- 4C 03 10  2190 SLW5 JMP SOFT      ...ABORT...
                2200 *
                2210 *    FAST-LIST ROUTINE
                2220 *
1CB2- C9 8D     2230 FLST CMP #$8D      IS IT CR?
1CB4- D0 F6     2240      BNE SLW4      NO, SO KEEP LISTING
1CB6- F0 DA     2250      BEQ SLW1      YES, SO CHECK FOR KEYS
                2260      .EN


SYMBOL TABLE

CH      0024    OLDC    00F0    NEWC    00F1
LNCT    00F4    PRTX    00F5    PRTY    00F6
DLAY    FCA8    COT1    FDF0    SOFT    1003
PRNT    1C00    PRT1    1C0B    PRT2    1C22
PRT3    1C2A    PRT5    1C41    PRT6    1C47
PRT9    1C48    PRT8    1C59    PRT7    1C5E
POUT    1C66    POT0    1C68    POT1    1C6B
POT2    1C73    POT3    1C76    POT4    1C78
POT5    1C7B    SLST    1C89    SLW1    1C92
SLW2    1C9E    SLW3    1CAA    SLW4    1CAC
SLW5    1CAF    FLST    1CB2

























C - 4

---------------------------------------------------------------------

APPENDIX D


Sources of help with machine language programming are plentiful, but
most of them do not deal with the same microcomputer that is in the
Apple II.  Here are some that I have found helpful.

1.  MC56500 Microcomputer Family Programming Manual, MOS Technology,
Inc., 1976.  This is "from the horse's mouth," so you should probably
get one from your computer store.  The same book has been published
by Synertek and Rockwell, who are both second sources for the 6502
chip.

2.  Programming the 6502, Rodnay Zaks, SYBEX, 1978.

3.  6502 Applications Book, Rodnay Zaks, SYBEX, 1979.

4.  How to Program Microcomputers, William Barden, Jr., Howard W.
Sams & Co., 1977.  This covers programming for the 8080, 6800, and
the 6502.  It has many simple programs for all three types.

5.  Programming a Microcomputer: 6502, Caxton C. Foster,
Addison-Wesley Publishing Company, 1978.  Oriented toward the KIM-1,
but has very good explanations and examples of the machine language.

6.  Apple-II Reference Manual, Apple Computer Company, 1978. You
already own this one!  It has the complete listing of the Apple
ROM-based monitor, and several other ROM-based routines.  This is a
gold mine!

7.  MICRO -- The 6502 Journal.  This is a monthly magazine dedicated
to the 6502 microprocessor.  It is published by The COMPUTERIST, P.
0. Box 6502, Chelmsford, MA 01824. Subscriptions are currently $15.00
per year, or 12 issues.

8.  Call-A.P.P.L.E., Apple Pugetsound Program Library Exchange.
Another magazine, dedicated strictly to the Apple II.  Free to
members, and membership is $10; write to 8710 Salty Drive N.W.,
Olympia, WA 98502.  Published nine times per year.

9.  APPLE-GRAM, the newsletter of the Dallas, Texas, Apple Corps.
Subscription is $12/year from The Apple Corps, P. 0. Box 5537,
Richardson, TX 75080.






D - 1

---------------------------------------------------------------------

10. The Apple Assembly Line, a newsletter specifically for those who
are using assembly language with their Apple computer. Subscription
is $12/year from S-C SOFTWARE, P. 0. Box 5537, Richardson, TX 75080.


One of the best ways to learn assembly or machine language is to
examine carefully the work of others.  I suggest you use the
dis-assembler which is in ROM in your Apple II to disassemble
everything in sight.  Look at how Integer BASIC and Applesoft are
coded.  Look inside S-C ASSEMBLER II and see how it works.  You can
even try making some changes and add in the features you think I
should have included in the first place!

Sources of help with learning to use SWEET-16 are even more limited.
Here are the ones I have found:

1.  "SWEET-16 -- The 6502 Dream Machine", BYTE, November, 1977, pages
150-159.  This is the definitive article written by the creator of
SWEET-16, Steve Wozniak.

2.  Apple II Reference Manual, pages 96-99.  This is the assembly
listing of SWEET-16, as found in your Apple II.

3.  Programmers Aid #1 Installation and Operating Manual.
This is the book that comes with the Programmers Aid #1 ROM.  It
includes listings of programs coded in SWEET-16 language:
Renumber/Append, pages 76-79; and 6502 Relocation Subroutine, pages
80-81.

4.  Occasional articles in Dr. Dobb's, MICRO, et cetera.
















D - 2

---------------------------------------------------------------------

Ads

---------------------------------------------------------------------

Double Precision Floating Point for APPLESOFT

A Brand New Tool for Every Apple Owner!

* Apple II or Apple II Plus

* Applesoft ROM Card or Language System

* 21-digit precision with arithmetic, INPUT, and PRINT

* Subroutines for ABS, SQR, LOG, EXP, SIN, COS, and ATN

* Efficient and compact assembly language coding:
  Only uses 2048 bytes of RAM
  Speed comparable to normal Applesoft arithmetic

* Automatically loaded beneath your Applesoft program

* Nearly standard syntax, simple interface using "&"
  feature of Applesoft language

* Disk includes nine sample programs

* Big 25-page Reference Manual



                        Just $50 at your local Apple Dealer!
                        Includes diskette with nine sample
                        programs and a 25-page reference
                        manual.

S-C SOFTWARE            *
P.O. Box 5537           Apple and Applesoft are trademarks
Richardson,TX75080      of the Apple Computer Company.
(214) 324-2050

---------------------------------------------------------------------

S-C ASSEMBLER II            Faster!
Version 4.0                   Easier to use!
                                More Powerful!

New Editing Features
* Automatic line numbers,       * Memory use display
  with selectable increment.
                                * Escape IJKM cursor control
* Append programs from disk.      with or without Autostart ROM.

* Renumber with selectable      * Two user programmable system
  base, increment, and start.     commands.

                    * And MUCH MORE!

New Assembly Features

* FASTER! Up to 6000 lines      * Up to 32-character labels.
  per minute!     
                                * Use ASCII literals in address
* Assembles from multiple         expressions.
  source files, using ".IN"
  directive.                    * Local labels for more readable
                                  modular programs.
* Stores object code directly
  on binary file, using ".TF"   * Alphabetized symbol table.
  directive. 
                                * User programmable directive.

* Listing control with PG       * Improved error messages, with
  (page eject), LIST OFF,         automatic display of bad line
  and LIST ON.                  to simplify correction.

                    * And MUCH MORE!

S-C ASSEMBLER II Version 4.0 is compatible with both the Apple II and
the Apple II Plus. At least 24K RAM is required, and at least one
disk drive.

S-C ASSEMBLER II Version 4.0 is
available now as an upgrade kit only.
The upgrade kit includes a documen-         S-C SOFTWARE
tation packet and a new diskette, for
only $22.50. Proof of ownership of a        P.O. Box 5537
previous disk version is required.          Richardson, TX 75080

(Version 3.2 is still available for
only $35.00)                                (214) 324-2050


---------------------------------------------------------------------
